package com.sino.dataworks.util;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalTime;
import java.util.Calendar;

@Slf4j
public class TimeCheckUtil {

    /**
     * 判断当前时间是否在月末指定天数内
     * @param days 月末天数
     * @return true 如果在月末指定天数内
     */
    public static boolean isMonthEnd(int days) {
        Calendar calendar = Calendar.getInstance();
        int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
        int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        return currentDay > (lastDay - days);
    }

    /**
     * 判断当前时间是否在月初指定天数内
     * @param days 月初天数
     * @return true 如果在月初指定天数内
     */
    public static boolean isMonthBegin(int days) {
        Calendar calendar = Calendar.getInstance();
        int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
        return currentDay <= days;
    }

    /**
     * 判断当前时间是否在指定时间点之后
     * @param hour 指定小时（24小时制）
     * @return true 如果当前时间在指定时间点之后
     */
    public static boolean isAfterHour(int hour) {
        Calendar calendar = Calendar.getInstance();
        int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
        return currentHour >= hour;
    }

    /**
     * 判断当前时间是否在指定时间之后（精确到分钟）
     * @param hour 指定小时（24小时制）
     * @param minute 指定分钟
     * @return true 如果当前时间在指定时间之后
     */
    public static boolean isAfterTime(int hour, int minute) {
        LocalTime now = LocalTime.now();
        LocalTime targetTime = LocalTime.of(hour, minute);
        return now.isAfter(targetTime);
    }

    /**
     * 检查是否需要报警
     * @param monthEndDays 月末天数
     * @param monthBeginDays 月初天数
     * @param checkHour 检查时间点（24小时制）
     * @param hasFile 是否检测到文件
     * @return true 如果需要报警
     */
    public static boolean shouldAlert(int monthEndDays, int monthBeginDays, int checkHour, boolean hasFile) {
        boolean isSpecialPeriod = isMonthEnd(monthEndDays) || isMonthBegin(monthBeginDays);

        if (isSpecialPeriod) {
            // 在月初或月末期间，需要在指定时间后检查文件
            if (isAfterHour(checkHour) && !hasFile) {
                log.info("在月初/月末期间，{}点后未检测到文件，需要报警", checkHour);
                return true;
            }
        } else {
            // 不在月初或月末期间，如果没有文件就直接报警
            if (!hasFile) {
                log.info("非月初/月末期间，未检测到文件，需要报警");
                return true;
            }
        }

        return false;
    }

  public static void main(String[] args) {
      boolean isSpecialPeriod = isAfterTime(9, 0);
      log.info("是否在特殊时间段：{}", isSpecialPeriod);
  }
}